<?php
/*

*/

$_D = false;

/**
 * Creer l'apercu de l'item.
 * Fonction qui va creer un apercu de l'item, dans la mesure du possible
 *
 * Attention cette fonction est silencieuse sur ses erreurs, pour le debug ajoutez $_D = true; en haut de cette page
 *
 * @param int/string $idItem id de l'item concerne ou le chemin de l'image en cas de stand alone
 * @param int $tailleX taille largeur de destination
 * @param int $tailleY taille hauteur de destination
 * @param int $r couleur rouge en arriere plan (0-255)
 * @param int $v couleur vert en arriere plan (0-255)
 * @param int $b couleur bleu en arriere plan (0-255)
 * @param float $ration ratio de redimension (0-1)
 * @return string $c chemin ou trouver l'apercu (**vide** en cas d'erreur)
 */
function apercu($idItem, $tailleX=128, $tailleY=128, $r=255, $v=255, $b=255, $ratio=0)
{
  global $_D;
  global $CONF;

  try
    {
      if(!ereg('/', $idItem)) 
	{
	  $item = new Item($idItem);
	  $typeItem     = $item->getType(); 
	  $cheminItem   = $item->getLien();
	}
      else
	{
	  $item = null;
	  $typeItem   = 1;
	  $cheminItem = $idItem;
	}

      $nomUnique    = time().'_'.rand(0,500);
      $cheminApercu = 'cache/'.$nomUnique.'.jpg';
      
    }
  catch(ListerException $e)
    {
      if($_D) echo "Impossible de construire l'item : ERREUR : $e->getMessage()";
      return '';
    }

  // test du type
  // ============

  // une image
  if($typeItem == IMG)
    {
      $cheminImage = $cheminItem;
      if(!eregi('^http://', $cheminImage) && @filesize($cheminImage) >= 4*1024*1024)
	{
	  if($_D) echo "L'image est trop lourde pour en faire un apercu (> 4Mo)";
	  return '';
	}
      
      // information de l'image    
      $infoImage = @getimagesize($cheminImage);
      $xSrc  = $infoImage[0];
      $ySrc  = $infoImage[1];
      $xDest = $tailleX;
      $yDest = $tailleY;
      
      // calcul de la nouvelle taille en cas de ratio
      if($ratio != 0)
	{
	  $xDest = floor($xSrc * $ratio);
	  $yDest = floor($ySrc * $ratio);
	}
      
      // creation d'un resource image a partir de l'image source
      switch($infoImage[2])
	{
	case 1: 
	  $imgSrc = @imagecreatefromgif($cheminImage);
	  break;
	case 2:
	  $imgSrc = @imagecreatefromjpeg($cheminImage);
	  break;
	case 3: 
	  $imgSrc = @imagecreatefrompng($cheminImage);
	  break;
	default : 
	  if($_D) echo "Le type d'image n'est pas pris en charge";
	  return '';
	}
      
      // calcul de la position de l'image dans l'apercu
      if($xSrc >= $ySrc)
	{
	  $x01 = $xDest;
	  $y01 = floor($xDest * $ySrc / $xSrc) + 1;
	  $x01Pos = floor(($xDest - $x01) / 2);
	  $y01Pos = floor(($yDest - $y01) / 2);
	}
      else
	{
	  $y01 = $yDest;
	  $x01 = floor($yDest * $xSrc / $ySrc) + 1;
	  $x01Pos = floor(($xDest - $x01) / 2);
	  $y01Pos = floor(($yDest - $y01) / 2);
	}
      
      // creation de la resource de l'image de destination (l'apercu)
      if(function_exists('imagecreatetruecolor'))
	{
	  $imageDest = @imagecreatetruecolor($xDest, $yDest);
	}
      elseif(function_exists('imagecreate'))
	{
	  $imageDest = @imagecreate($xDest, $yDest);
	}
      else
	{
	  if($_D) echo "Les fonctions imagecreate* ne sont pas disponibles, verifiez que GD est bien installe";
	  return '';
	}
      
      // couleur d'arriere plan de l'apercu  
      $bg = @imagecolorallocate($imageDest, $r, $v, $b);
      @imagefill($imageDest, 0, 0, $bg);
      
      // copie/redimension de la source dans la destination
      if(!@imagecopyresized($imageDest, $imgSrc, $x01Pos, $y01Pos, 0, 0, $x01, $y01, $xSrc, $ySrc))
	{
	  if($_D) echo "Impossible de faire la copie/redimension";
	  return '';
	}
      
      // enregistrement de l'image
      if(!@imagejpeg($imageDest, $cheminApercu, $CONF['apercu_qual']))
	{
	  if ($_D) echo "Impossible d'enregistrer l'image, le repertoire existe ? les droits sont suffisants ?";
	  return '';
	}
      
    }
  elseif($typeItem == VID)
    {
      $cheminVideo     = $cheminItem;
      $cheminApercuTmp = $cheminApercu.'.png';
      if(eregi('^http://', $cheminVideo))
	{
	  if($_D) echo "La vidéo n'est pas une vidéo locale";
	  return '';
	}
      
      // Quelque soit le programme utilisé il doit créer une image valide dont le chemin est $cheminApercuTmp
      // ici c'est totem qui est utilisé mais mplayer ou un autre binaire ferait très bien l'affaire
      exec('totem-video-thumbnailer -s '.$tailleX.'x'.$tailleY.' '.$cheminVideo.' '.$cheminApercuTmp);

      if(!@file_exists($cheminApercuTmp))
	{
	  if($_D) echo "Echec lors de la création de l'aperçu vidéo.";
	  return '';
	}

      $cheminApercu = apercu($cheminApercuTmp, $tailleX, $tailleY, $r, $v, $b, $ratio);
      if(file_exists($cheminApercuTmp)) unlink($cheminApercuTmp);
    }
  
  if(empty($cheminApercu) || !@file_exists($cheminApercu))
    {
      if($_D) echo "Hum, le fichier final n'existe pas, si il n'y a pas d'erreur ci dessus, alors bonne chance pour le debug :p";
      return '';
    }
  
  return $cheminApercu;
}


/**
 * Creer l'apercu d'une vCard
 * Fonction qui va creer un apercu de la vCard, dans la mesure du possible
 *
 * Attention cette fonction est silencieuse sur ses erreurs, pour le debug ajoutez $_D = true; en haut de cette page
 *
 * @param string Données encodées extraites de la vCard
 * @param int $tailleX taille largeur de destination
 * @param int $tailleY taille hauteur de destination
 * @param int $r couleur rouge en arriere plan (0-255)
 * @param int $v couleur vert en arriere plan (0-255)
 * @param int $b couleur bleu en arriere plan (0-255)
 * @param float $ration ratio de redimension (0-1)
 * @return string $c chemin ou trouver l'apercu (**vide** en cas d'erreur)
 */
function apercu_vcard($data, $tailleX=128, $tailleY=128, $r=255, $v=255, $b=255, $ratio=0)
{
  global $_D;
  global $CONF;

  try
    {
      $item = null;
      $typeItem   = CON;
      
      $nomUnique    = time().'_'.rand(0,500);
      $cheminApercu = 'cache/'.$nomUnique.'.jpg';
      
    }
  catch(ListerException $e)
    {
      if($_D) echo "Impossible de construire l'item : ERREUR : $e->getMessage()";
      return '';
    }

  $data = base64_decode($data);
      
  // creation d'un resource image a partir de l'image source
  if(function_exists('imagecreatefromstring'))
    {
      $imgSrc = @imagecreatefromstring($data);
    }
  else
    {
      if($_D) echo "Les fonctions imagecreate* ne sont pas disponibles, verifiez que GD est bien installe";
      return '';
    }

  // information de l'image    
  $xSrc  = imagesx($imgSrc);
  $ySrc  = imagesy($imgSrc);
  $xDest = $tailleX;
  $yDest = $tailleY;
  
  // calcul de la nouvelle taille en cas de ratio
  if($ratio != 0)
    {
      $xDest = floor($xSrc * $ratio);
      $yDest = floor($ySrc * $ratio);
    }
  
      // calcul de la position de l'image dans l'apercu
  if($xSrc >= $ySrc)
    {
      $x01 = $xDest;
      $y01 = floor($xDest * $ySrc / $xSrc) + 1;
      $x01Pos = floor(($xDest - $x01) / 2);
      $y01Pos = floor(($yDest - $y01) / 2);
    }
  else
    {
      $y01 = $yDest;
      $x01 = floor($yDest * $xSrc / $ySrc) + 1;
      $x01Pos = floor(($xDest - $x01) / 2);
      $y01Pos = floor(($yDest - $y01) / 2);
    }
  
  // creation de la resource de l'image de destination (l'apercu)
  if(function_exists('imagecreatetruecolor'))
    {
      $imageDest = @imagecreatetruecolor($xDest, $yDest);
    }
  elseif(function_exists('imagecreate'))
    {
      $imageDest = @imagecreate($xDest, $yDest);
    }
  else
    {
      if($_D) echo "Les fonctions imagecreate* ne sont pas disponibles, verifiez que GD est bien installe";
      return '';
    }
  
  // couleur d'arriere plan de l'apercu  
  $bg = @imagecolorallocate($imageDest, $r, $v, $b);
  @imagefill($imageDest, 0, 0, $bg);
  
  // copie/redimension de la source dans la destination
  if(!@imagecopyresized($imageDest, $imgSrc, $x01Pos, $y01Pos, 0, 0, $x01, $y01, $xSrc, $ySrc))
    {
      if($_D) echo "Impossible de faire la copie/redimension";
      return '';
    }
  
  // enregistrement de l'image
  if(!@imagejpeg($imageDest, $cheminApercu, $CONF['apercu_qual']))
    {
      if ($_D) echo "Impossible d'enregistrer l'image, le repertoire existe ? les droits sont suffisants ?";
      return '';
    }
  
  return $cheminApercu;
}

/**
 * Creer l'apercu d'un favoris
 * Fonction qui va creer un apercu de la vCard, dans la mesure du possible
 *
 * Attention cette fonction est silencieuse sur ses erreurs, pour le debug ajoutez $_D = true; en haut de cette page
 *
 * @param string Données encodées extraites de la vCard
 * @param int $tailleX taille largeur de destination
 * @param int $tailleY taille hauteur de destination
 * @param int $r couleur rouge en arriere plan (0-255)
 * @param int $v couleur vert en arriere plan (0-255)
 * @param int $b couleur bleu en arriere plan (0-255)
 * @param float $ration ratio de redimension (0-1)
 * @return string $c chemin ou trouver l'apercu (**vide** en cas d'erreur)
 */
function apercu_favoris($url, $tailleX=128, $tailleY=128, $r=255, $v=255, $b=255, $ratio=0)
{
  global $_D;
  global $CONF;


  try
    {
      $item = null;
      $typeItem   = CON;
      
      $nomUnique    = time().'_'.rand(0,500);
      $cheminApercu = 'cache/'.$nomUnique.'.jpg';
      $HTTPRequest = @fopen($url, 'r');
      if ($HTTPRequest)
	{
	  $favicon = fread($HTTPRequest, 8192);
	  fclose($HTTPRequest);
	  $dest = fopen($cheminApercu, 'w');
	  fwrite($dest, $favicon);
	  return $cheminApercu;
	}
    }
  catch(ListerException $e)
    {
      if($_D) echo "Impossible de construire l'item : ERREUR : $e->getMessage()";
      return '';
    }
}
?>
